package reflect;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;
/**
 * java的反射机制：
 * 反射是Java的动态机制，允许程序在[运行期间]再确定如对象的实例化、属性操作、方法调用等
 * 可以提高代码的灵活性、扩展性、维护性
 * 但是运行效率相对降低同时开销增多
 * 需要适度使用
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
          反射的第一步: 获取要操作的类的类对象
          java.lang.Class(类对象)
          它的每一个实例用于表示一个被JVM加载的类，
          意味着JVM每加载一个类的同时就会实例化一个Class对象与之绑定
          并在该Class实例上记录所加载的类的一切信息，通过Class可以了解这个类的所有信息
         */
        //通过class获取类对象：
        Class c1 = String.class;
        Class c2 = ArrayList.class;
        Class c3 = int.class;

        //通过指定类的完全限定名获取一个类的类对象
        Class c4 = Class.forName("java.lang.String");
        Class c5 = Class.forName("java.util.ArrayList");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个类名：");
        String name = sc.nextLine();
        Class c6 = Class.forName(name); //基于类名构造Class类对象

        System.out.println("获取类的完全限定名："+c6.getName());
        System.out.println("获取类名："+c6.getSimpleName());
        /*
          Class的每个实例用于表示一个类
          Package是反射对象之一，它的每个实例用于表示一个包
         */
        Package pack = c6.getPackage();
        System.out.println(pack);
        System.out.println("获取包名："+c6.getPackage().getName());
        /*
          Method是反射对象之一，它的每个实例用于表示一个类的方法
         */
        Method[] methods = c6.getMethods(); //获取所有方法
        System.out.println("一共"+methods.length+"个方法");
        for(Method m:methods){
            System.out.println(m.getName()); //获取方法名
        }
    }
}
/*
getName().getSimpleName().getPackage()
 */